#include<bits/stdc++.h> 
using namespace std;
// 家族等级往往会形成一棵树，我的工作是数一数多少人没孩子 
//1.	每次一组输入，第一行有2个正整数，0<N<100表示整棵树的结点个数，M<N表示非叶子
//	的结点个数。 
//2.	接下来有M行输入，每一行输入为 ID K ID[1] ID[2]... ID[K]的格式，其中ID是一个
//	两位数字组成的代表非叶子的结点，K是该结点的孩子个数，后续写出其所有孩子 
//3.	为了方便起见，根节点为01 
//4.	输入确保不会出现N=0的情况 
//5.	对于每一组输入，需要计数从根节点开始所有层的没有子结点的结点个数 
//6.	输出的两个数字间用空格隔开
//7.  BFS

vector<int> Node[101];//为了方便起见，都从1开始计数，所以数组扩大1个 
int count_[101];//存储每一层叶子节点的个数 
int deep[101];//存储各个节点所在的深度 
int max_ = 0;
void BFS(){
	queue<int> Q;	//整一个队列，把结点1丢进去 
	Q.push(1);
	deep[1] = 1; 
	//Q只要不为空就不停的遍历处理 
	while(!Q.empty()){ 
		int now = Q.front();	//取出最前面的元素进行处理 
		Q.pop();	//弹出最前面的元素 
		max_ = max(max_, deep[now]);	//比较max_与当前结点深度，用于获取最大深度
		if (Node[now].empty()) ++count_[deep[now]]; //如果某节点没有子节点，则该层计数+1
		for(int i = 0;i<Node[now].size();i++){
			deep[Node[now][i]] = deep[now] + 1;//每个子节点的层数为当前层数+1 
			Q.push(Node[now][i]); 
		} 
	}
}
int main(){
	int N, M;
	cin>>N>>M;
	for(int i=0;i<M;i++){
		int parent, k, child;
		cin>>parent>>k;
		for(int j=0;j<k;j++){
			cin>>child;
			Node[parent].push_back(child);	//将每个父节点的子节点push进去 
		}
	}
	BFS(); 
	//BFS结束后，得到了最大层数 
	for(int i = 1;i<max_;i++){
		cout<<count_[i]<<" ";
	}
	cout<<count_[max_]<<endl;
}